﻿using GENERIC.Interfaces.Respository;
using GENERIC.Interfaces.Service;
using GENERIC.Model;
using GENERIC.Respository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;

namespace GENERIC.Service
{
    /// <summary>
    /// Classe de base pour les services
    /// </summary>
    public abstract class AbstractService<TEntity> : ServiceBase, IAbstractService<TEntity> where TEntity : ModelBase
    {
        #region Constructeur

        /// <summary>
        /// Initialise une nouvelle instance de la classe DBService
        /// </summary>
        public AbstractService(IRepository<TEntity> repository)
        {
            Repository = repository;
        }

        #endregion

        #region Propriétés

        /// <summary>
        /// Obtient le contexte
        /// </summary>
        protected IRepository<TEntity> Repository
        {
            get;
            private set;
        }

        #endregion

        #region Méthodes

        /// <summary>
        /// Obtient un ensemble de données correspondant au type d'entité
        /// </summary>
        /// <returns>un ensemble de données correspondant au type d'entité</returns>
        public virtual IQueryable<TEntity> GetAll()
        {
            return Repository.GetAll();
        }

        /// <summary>
        /// Insertion d'une entité
        /// </summary>
        /// <param name="entity">entité</param>
        public virtual void Insert(TEntity entity)
        {
            Repository.Insert(entity);
        }

        /// <summary>
        /// Mise à jour d'une entité
        /// </summary>
        /// <param name="entity">entité</param>
        public virtual void Update(TEntity entity)
        {
            Repository.Update(entity);
        }

        /// <summary>
        /// Suppression d'une entité
        /// </summary>
        /// <param name="entity">entité</param>
        public virtual void Delete(TEntity entity)
        {
            Repository.Delete(entity);
        }

        /// <summary>
        /// Obtenir une collection d'entité
        /// </summary>
        /// <param name="expression">Critères de séléction</param>
        /// <returns></returns>
        public IQueryable<TEntity> Get(System.Linq.Expressions.Expression<Func<TEntity, bool>> expression)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Obtenir une collection d'entités en asynchrone
        /// </summary>
        /// <param name="expression">Critère de séléction</param>
        /// <param name="callback">Collection d'entité</param>
        /// <returns>Résultat</returns>
        public bool GetAsync(Expression<Func<TEntity, bool>> expression, Action<IAsyncResponse, List<TEntity>> callback)
        {
            return Repository.GetAsync(expression, callback);
        }

        #endregion
    }
}
